home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1992 June: ROMin Holiday / ADC Developer CD (1992-06) (''ROMin Holiday'')_iso / Developer Connection - 06-1992.iso / Periodicals / develop / develop 8 code / Curves in Quickdraw / QD Curves / access menu.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-10-09  |  5.7 KB  |  265 lines  |  [TEXT/KAHL]

  1. #include <Fonts.h>
  2. #include <Resources.h>
  3. #include <QuickDraw.h>
  4. #include <Menus.h>
  5. #include <Memory.h>
  6.  
  7. #include "access.h"
  8.  
  9. typedef struct {
  10.     short familyIndex;
  11.     short styleIndex;
  12.     short fondID;
  13.     short faceID;
  14.     Handle sfnt;
  15. } fontElement;
  16.  
  17. typedef struct {
  18.     short fontCount;
  19.     short familyCount;
  20.     /* fontRecord[fontCount] */
  21. } fontListHead, **fontList;
  22.  
  23. #define fontListDefined
  24. #include "access menu.h"
  25.  
  26. #define NO_FAMILY    -1
  27.  
  28. static int PCompare(unsigned char* a, unsigned char* b)
  29. {
  30.     short size_a = *a++;
  31.     short size_b = *b++;
  32.     short size = size_a < size_b ? size_a : size_b;
  33.  
  34.     for (--size; size >= 0; --size)
  35.         if (*a++ != *b++)
  36.             return a[-1] - b[-1];
  37.     return size_a - size_b;
  38. }
  39.  
  40. static fontList NewFontList(void)
  41. {
  42.     fontList list = (fontList)NewHandle(sizeof(fontListHead));
  43.     if (!list || MemError())
  44.     {    Debugger();
  45.         return 0;
  46.     }
  47.     (**list).fontCount = (**list).familyCount = 0;
  48.     return list;
  49. }
  50.  
  51. static void AddToFontList(fontList list, short fondID, short faceID, Handle sfnt)
  52. {
  53.     fontElement* elem;
  54.  
  55.     SetHandleSize((Handle)list, sizeof(fontListHead) + ((**list).fontCount+1) * sizeof(fontElement));
  56.     if (MemError())
  57.         Debugger();
  58.  
  59.     elem = (fontElement*)(*list + 1) + (**list).fontCount++;
  60.     
  61.     elem->familyIndex = NO_FAMILY;
  62.     elem->fondID = fondID;
  63.     elem->faceID = faceID;
  64.     elem->sfnt = sfnt;
  65. }
  66.  
  67. static int lowercase(int c)
  68. {
  69.     if (c >= 'A' && c <= 'Z')
  70.         return c - 'A' + 'a';
  71.     return c;
  72. }
  73.  
  74. static int FirstIsBigger(unsigned char* a, unsigned char* b)
  75. {
  76.     int count_a = *a++;
  77.     int count_b = *b++;
  78.     int count = count_a < count_b ? count_a : count_b;
  79.  
  80.     for (--count; count >= 0; --count)
  81.         if (lowercase(*a++) > lowercase(*b++))
  82.             return true;
  83.     return count_a > count_b;    
  84. }
  85.  
  86. static void MakeFontFamilies(fontList list)
  87. {
  88.     HLock((Handle)list);
  89.     {    fontListHead* head = *list;
  90.         fontElement* elem = (fontElement*)(head + 1);
  91.         fontElement* stop = elem + head->fontCount;
  92.         
  93.         for (; elem < stop; elem++)
  94.         {    Str255 familyName;
  95.             short styleIndex;
  96.  
  97.             if (elem->familyIndex != NO_FAMILY)
  98.                 continue;
  99.             
  100.             elem->familyIndex = head->familyCount++;
  101.             elem->styleIndex = styleIndex = 0;
  102.             if (!GetSfntNameString(elem->sfnt, name_Family, familyName))
  103.             {    fontElement* tmp = elem + 1;
  104.                 for (; tmp < stop; tmp++)
  105.                     if (tmp->familyIndex == NO_FAMILY)
  106.                     {    Str255 name;
  107.                         GetSfntNameString(tmp->sfnt, name_Family, name);
  108.                         if (PCompare(familyName, name) == 0)
  109.                         {    tmp->familyIndex = elem->familyIndex;
  110.                             tmp->styleIndex = ++styleIndex;
  111.                         }
  112.                     }
  113.             }
  114.             else
  115.                 Debugger();
  116.         }
  117.     }
  118.     HUnlock((Handle)list);
  119. }
  120.  
  121. fontList BuildFontList(void)
  122. {
  123.     short i, fonds = CountResources('FOND');
  124.     fontList list = NewFontList();
  125.  
  126.     for (i = 1; i <= fonds; i++)
  127.     {    Handle fond = GetIndResource('FOND', i);
  128.  
  129.         if (fond && !ResError())
  130.         {    FamRec* frec = (FamRec*)*fond;
  131.             short* assoc = (short*)(frec + 1);
  132.             short count = *assoc++;
  133.             short fondID;
  134.             
  135.             HLock(fond);
  136.             {    ResType rType;
  137.                 Str255 name;
  138.                 GetResInfo(fond, &fondID, &rType, name);
  139.             }
  140.             while (count-- >= 0 && *assoc++ == 0)
  141.             {    short faceID = *assoc++;
  142.                 short sfntID = *assoc++;
  143.                 Handle sfnt = GetResource('sfnt', sfntID);
  144.  
  145.                 if (sfnt && !ResError())
  146.                     AddToFontList(list, fondID, faceID, sfnt);
  147.             }
  148.             HUnlock(fond);
  149.         }
  150.     }
  151.     MakeFontFamilies(list);
  152.     return list;
  153. }
  154.  
  155. short CountFontFamilies(fontList list)
  156. {
  157.     return (**list).familyCount;
  158. }
  159.  
  160. short CountFontStyles(fontList list, short familyIndex)
  161. {
  162.     familyIndex--;
  163.     if (familyIndex < 0 || familyIndex >= (**list).familyCount)
  164.     {    Debugger();
  165.         return 0;
  166.     }
  167.     else
  168.     {    short count = 0;
  169.         fontElement* elem = (fontElement*)(*list + 1);
  170.         fontElement* stop = elem + (**list).fontCount;
  171.         for (; elem < stop; elem++)
  172.             if (elem->familyIndex == familyIndex)
  173.                 count++;
  174.         return count;
  175.     }
  176. }
  177.  
  178. Handle GetFontStyle(fontList list, short familyIndex, short styleIndex)
  179. {
  180.     familyIndex--;
  181.     styleIndex--;
  182.     if (familyIndex < 0 || familyIndex >= (**list).familyCount)
  183.     {    Debugger();
  184.         return 0;
  185.     }
  186.     else
  187.     {    fontElement* elem = (fontElement*)(*list + 1);
  188.         fontElement* stop = elem + (**list).fontCount;
  189.         for (; elem < stop; elem++)
  190.             if (elem->familyIndex == familyIndex && elem->styleIndex == styleIndex)
  191.                 return elem->sfnt;
  192.         Debugger();
  193.         return 0;
  194.     }
  195. }
  196.  
  197. short GetFontFace(fontList list, short familyIndex, short styleIndex)
  198. {
  199.     familyIndex--;
  200.     styleIndex--;
  201.     if (familyIndex < 0 || familyIndex >= (**list).familyCount)
  202.     {    Debugger();
  203.         return 0;
  204.     }
  205.     else
  206.     {    fontElement* elem = (fontElement*)(*list + 1);
  207.         fontElement* stop = elem + (**list).fontCount;
  208.         for (; elem < stop; elem++)
  209.             if (elem->familyIndex == familyIndex && elem->styleIndex == styleIndex)
  210.                 return elem->faceID;
  211.         Debugger();
  212.         return 0;
  213.     }
  214. }
  215.  
  216. short GetFontFond(fontList list, short familyIndex, short styleIndex)
  217. {
  218.     familyIndex--;
  219.     styleIndex--;
  220.     if (familyIndex < 0 || familyIndex >= (**list).familyCount)
  221.     {    Debugger();
  222.         return 0;
  223.     }
  224.     else
  225.     {    fontElement* elem = (fontElement*)(*list + 1);
  226.         fontElement* stop = elem + (**list).fontCount;
  227.         for (; elem < stop; elem++)
  228.             if (elem->familyIndex == familyIndex && elem->styleIndex == styleIndex)
  229.                 return elem->fondID;
  230.         Debugger();
  231.         return 0;
  232.     }
  233. }
  234.  
  235. short FindFamilyIndex(fontList list, Str255 familyName)
  236. {
  237.     fontElement* elem = (fontElement*)(*list + 1);
  238.     fontElement* stop = elem + (**list).fontCount;
  239.     for (; elem < stop; elem++)
  240.     {    Str255 name;
  241.         GetSfntNameString(elem->sfnt, name_Family, name);
  242.         if (PCompare(name, familyName) == 0)
  243.             return elem->familyIndex + 1;
  244.     }
  245.     Debugger();
  246.     return 0;
  247. }
  248.  
  249. void SortMenu(MenuHandle menu)
  250. {
  251.     short i, j, count = CountMItems(menu);
  252.  
  253.     for (i = 2; i <= count; i++)
  254.         for (j = count; j >= i; --j) {
  255.             Str255 lower, upper;
  256.             GetItem(menu, j, lower);
  257.             GetItem(menu, j-1, upper);
  258.             if (PCompare(lower, upper) < 0) {
  259.                 SetItem(menu, j, upper);
  260.                 SetItem(menu, j-1, lower);
  261.             }
  262.         }
  263. }
  264.  
  265.